package cn.fzkj.springboot.service;

import cn.fzkj.springboot.domain.Employee;
import cn.fzkj.springboot.domain.EmployeeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;

import java.util.List;

@CacheConfig(cacheNames = {"employee"}, cacheManager ="myrediscachemanager")   // 抽取缓存注解的公共配置
@Service
public class EmployeeService {

    @Autowired
    EmployeeRepository employeeRepository;

    @Cacheable(cacheNames = {"employee"},unless = "#result == null", keyGenerator = "myKeyGenerator")  // 将方法的结果缓存起来
    public List<Employee> findAll(){
        return employeeRepository.findAll();
    }

    /**
     * Cacheable
     *  cacheNames： 缓存组件，相当于保存缓存数据的那个map的名字
     *  key：缓存数据使用的key，可以使用spel表达式
     *  keyGenerator：key的生成器
     *  cacheManager：缓存管理器
     *  cacheResoler：缓存解析器
     *  condition：符合条件的情况下才缓存eg：#id>0
     *  unless：当条件为false时才会缓存
     *  sync：是否使用异步模式
     *  , keyGenerator = "myKeyGenerator"
     *  ,unless = "#result == null"
     * @param id
     * @return
     */
    @Cacheable(/*value = {"employee"}, */key = "#id")  // 将方法的结果缓存起来
    public Employee getOne(int id){
        return employeeRepository.getOne(id);
    }

    public Employee getById(int id){
        return employeeRepository.getById(id);
    }

    public Employee insert(Employee employee){
        return employeeRepository.save(employee);
    }


    /**
     * CachePut：调用方法，同时更新缓存
     * 目标方法调用完成之后将方法结果缓存起来
     */

    @CachePut(/*value = {"employee"}, */key = "#employee.id")
    public Employee update (Employee employee){
        employeeRepository.updateEmp(employee);
        System.out.println("员工信息更新完成。。。。。");
        return employee;
    }


    /**
     * CacheEvict：缓存清除，删除后将缓存清除掉
     * allEntries = false ，是否删除所有缓存
     * ,beforeInvocation = false，是否是在方法之前执行
     */
    @CacheEvict(/*cacheNames = {"employee"}, */key = "#id")
    public void del(int id){
//        employeeRepository.deleteById(id);
        System.out.println("员工已删除............");
    }


    /**
     * @Caching：复杂的缓存规则
     */

    @Caching(
            cacheable = {
                    @Cacheable(key = "#name")  // name作为key，方法返回值作为value进行缓存
            },
            put = {
                    @CachePut(key = "#result.id"),
                    @CachePut(key = "#result.email")
            }
    )
    public Employee getEmpByName(String name){
        return employeeRepository.findEmpByName(name);
    }


}
